package com.jctrip.hotel.source.model.meituan.resp;

import lombok.Data;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;

/**
 * @Author: zxy
 * @CreateTime: 2023-12-25 16:29
 * @Description: https://developer-distribution.meituan.com/#/apiDocs/1/13/63
 */
@Data
public class ContentResp implements Serializable {
    /**
     * 酒店内容信息列表
     */
    private List<HotelContent> hotelContents;

    @Data
    public static class HotelContent implements Serializable {
        /**
         * 酒店ID
         */
        private Long hotelId;

        /**
         * 酒店基本信息
         */
        private BaseInfo baseInfo;

        /**
         * 酒店详细信息
         */
        private DetailInfo detailInfo;

        /**
         * 酒店通知
         * 通知信息类型：REMIND：酒店提示；IMPORTANT_NOTICE:重要通知；CITY_NOTICE:城市通知
         */
        private List<Notice> notices;

        /**
         * 酒店政策
         */
        private Policy policy;

        /**
         * 酒店服务及设施，参见《酒店设施服务字典》
         */
        private List<Facility> facilities;

        /**
         * 酒店图片信息
         */
        private List<Image> images;

        /**
         * 物理房型基本信息
         */
        private List<RoomBaseInfo> roomBaseInfos;
    }

    @Data
    public static class BaseInfo implements Serializable {
        /**
         * 酒店名称
         */
        private String name;

        /**
         * 酒店英文名称
         */
        private String nameEn;

        /**
         * 酒店位置信息，包括城市、省份、行政区、经纬度、详细地址信息等
         */
        private Address address;

        /**
         * 酒店联系电话
         */
        private String phone;

        /**
         * 酒店是否可订。false:不可订，true:可订
         */
        private Boolean bookable;
    }

    @Data
    public static class Address implements Serializable {
        /**
         * 国家信息
         */
        private Country country;

        /**
         * 酒店所在省份，海外酒店返回空
         */
        private Province province;

        /**
         * 酒店所在城市
         */
        private City city;

        /**
         * 酒店所在城市行政区名，如“松江区”，海外酒店返回空
         */
        private Area area;

        /**
         * 酒店所在的商圈
         */
        private List<BusinessDistrict> businessDistricts;

        /**
         * 酒店的经纬度信息
         */
        private List<Coordinate> coordinates;

        /**
         * 酒店详细地址
         */
        private AddressLine addressLine;
    }

    @Data
    public static class Country implements Serializable {
        /**
         * 国家代码
         */
        private Integer code;

        /**
         * 国家名称
         */
        private String name;

        /**
         * 国家名称-英文
         */
        private String nameEn;
    }

    @Data
    public static class Province implements Serializable {
        /**
         * 省份代码，海外酒店返回空
         */
        private Integer code;

        /**
         * 省份名称，海外酒店返回空
         */
        private String name;

        /**
         * 省份名称-英文，海外酒店返回空
         */
        private String nameEn;
    }

    @Data
    public static class City implements Serializable {
        /**
         * 城市id
         */
        private Integer code;

        /**
         * 城市名称
         */
        private String name;

        /**
         * 城市名称--英文
         */
        private String nameEn;
    }

    @Data
    public static class Area implements Serializable {
        /**
         * 城市行政区ID，海外酒店返回空
         */
        private Integer code;

        /**
         * 城市行政区名称，海外酒店返回空
         */
        private String name;
    }

    @Data
    public static class BusinessDistrict implements Serializable {
        /**
         * 商业区ID
         */
        private Integer code;

        /**
         * 商业区名称
         */
        private String name;
    }

    @Data
    public static class Coordinate implements Serializable {
        /**
         * 服务提供商
         * 可选值："GAODE" ：高德、"BAIDU"：百度、"MAPBAR"：图吧、"GOOGLE"：谷歌
         */
        private String provider;

        /**
         * 酒店位置经度（经度*10^6）
         */
        private Integer longitude;

        /**
         * 酒店位置纬度（纬度*10^6）
         */
        private Integer latitude;
    }

    @Data
    public static class AddressLine implements Serializable {
        /**
         * 酒店详细地址-英文
         */
        private String name;

        /**
         * 酒店详细地址
         */
        private String nameEn;
    }

    @Data
    public static class DetailInfo implements Serializable {
        /**
         * 开业时间，格式为yyyy/MM或yyyy/MM/dd
         */
        private String openDate;

        /**
         * 装修时间，格式为yyyy/MM或yyyy/MM/dd
         */
        private String decorationDate;

        /**
         * 酒店填写的营业时间，无固定格式，可能是12小时制或24小时制
         */
        private String openHours;

        /**
         * 酒店统计信息，包括的统计信息如下：
         * "ROOM_COUNT"：客房总数
         * "FLOOR_COUNT"：酒店楼层高度
         * "MEETING_ROOM_COUNT"：会议室数量
         * "RESTAURANT_COUNT"：餐厅数量
         */
        private Statistic statistics;

        /**
         * 描述信息
         */
        private String description;

        /**
         * 酒店评分，目前只有平均评分：
         * "AVG_SCORE": 平均评分
         */
        private List<Rating> ratings;

        /**
         * 品牌信息
         */
        private Brand brand;

        /**
         * 集团信息
         */
        private Group group;

        /**
         * 酒店主题：
         * 0-购物便捷；
         * 1-培训学习；
         * 2-蜜月出行；
         * 3-休闲情调；
         * 4-交通便利；
         * 5-离医院近；
         * 6-商旅之家；
         * 7-四合院；
         * 8-园林庭院；
         * 9-安静优雅；
         * 10-特色建筑；
         * 11-周边美景；
         * 12-家有萌宠；
         * 13-文艺范儿；
         * 14-观景露台；
         * 15-古色古香；
         * 16-亲子酒店；
         * 17-温泉酒店；
         */
        private List<Theme> themes;

        /**
         * 酒店类型：
         * 1-快捷酒店;
         * 2-商务酒店;
         * 3-主题酒店;
         * 4-情侣酒店;
         * 5-公寓;
         * 6-客栈;
         * 7-民宿;
         * 8-青年旅舍;
         * 9-农家院;
         * 10-家庭旅馆;
         * 11-招待所;
         * 12-度假酒店;
         * 13-别墅;
         * 14-汽车旅馆;
         * 15-小木屋;
         * 16-牧人小屋;
         * 17-山间小屋;
         * 18-船屋;
         * 19-树屋;
         * 20-旅行车停车场;
         * 21-排屋;
         * 22-城堡;
         * 23-帐篷屋;
         * 24-宫殿;
         * 25-观光农业旅游;
         * 26-游轮;
         * 27-日式旅馆;
         */
        private List<Type> types;

        /**
         * 酒店星级:
         * 0-国家旅游局颁布五星级证书;
         * 1-豪华（按五星级标准建造）;
         * 2-国家旅游局颁布四星级证书;
         * 3-高档（按四星级标准建造）;
         * 4-国家旅游局颁布三星级证书;
         * 5-舒适型（按三星级标准建造）;
         * 6-经济型;
         * 7-低档;
         * 8-民宿;
         */
        private List<Star> star;
    }

    @Data
    public static class Statistic implements Serializable {
        /**
         * 酒店统计信息类型
         */
        private String type;

        /**
         * 酒店统计信息字段返回的统计值
         */
        private String value;
    }

    @Data
    public static class Rating implements Serializable {
        /**
         * 评分类型。
         */
        private String type;

        /**
         * 评分值，5分制，取值为实际值*10。如用户评分为4.2分，则value=42
         */
        private String value;
    }

    @Data
    public static class Brand implements Serializable {
        /**
         * 品牌ID
         */
        private String code;

        /**
         * 品牌名称
         */
        private String name;
    }

    @Data
    public static class Group implements Serializable {
        /**
         * 集团ID
         */
        private String code;

        /**
         * 集团名称
         */
        private String name;
    }

    @Data
    public static class Theme implements Serializable {
        /**
         * 酒店主题对应的code
         */
        private String code;

        /**
         * 酒店主题内容
         */
        private String name;
    }

    @Data
    public static class Type implements Serializable {
        /**
         * 酒店类型对应的code
         */
        private String code;

        /**
         * 酒店类型名称
         */
        private String name;
    }

    @Data
    public static class Star implements Serializable {
        /**
         * 酒店星级对应的code
         */
        private String code;

        /**
         * 酒店星级
         */
        private String name;
    }

    @Data
    public static class Notice implements Serializable {
        /**
         * 通知类型。
         */
        private String type;

        /**
         * 通知信息
         */
        private String value;
    }

    @Data
    public static class Policy implements Serializable {
        /**
         * 入住政策
         */
        private CheckinPolicy checkinPolicy;

        /**
         * 离店政策
         */
        private CheckOutPolicy checkOutPolicy;

        /**
         * 住客政策
         */
        private GuestPolicy guestPolicy;

        /**
         * 早餐政策
         */
        private BreakfastPolicy breakfastPolicy;

        /**
         * 宠物政策
         */
        private PetPolicy petPolicy;

        /**
         * 停车场政策
         */
        private List<ParkingPolicy> parkingPolicies;

        /**
         * 充电车位政策
         */
        private List<ChargePointPolicy> chargePointPolicies;
    }

    @Data
    public static class CheckinPolicy implements Serializable {
        /**
         * 开始入住时间
         * 登记入住开始时间，格式为HH:mm，取值范围为[06:00, 23:30]，半小时为一个取值点，如"06:00"、"06:30"
         */
        private String start;

        /**
         * 截止入住时间：
         * 若为0，则表示没有截止入住时间，即”开始入住时间之后“，日期需大于入住时间；
         * 其他取值14:30 ~ 23:59 ，半小时为一个取值点，如：15:00、23:30、23:59
         */
        private String end;
    }

    @Data
    public static class CheckOutPolicy implements Serializable {
        /**
         * 次日离店开始时间：
         * 00:00~12:30、23:30
         * 半小时为一个取值点，另增加一个枚举值为0；如：08:00、21:30
         * 若为0（不限），则表示不限制开始离店时间，即“次日离店截止时间之前”
         */
        private String start;

        /**
         * 离店时间，checkoutTime="0"表示固定小时制离店，即入住hours小时之后离店；非0值则格式为HH:mm，取值范围为[07:00 ~ 23:30]，半小时为一个取值点，如"14:30"、"15:00"。当天的最后半个小时特殊处理，表示为"23:59"。
         * 取值需晚于次日离店开始时间
         */
        private String end;

        /**
         * 固定小时后离店,可支持1位小数点
         */
        private BigDecimal hours;
    }

    @Data
    public static class GuestPolicy implements Serializable {
        /**
         * 外宾政策
         * 0：无
         * 1：酒店接待大陆、港澳台及外国客人
         * 2：酒店仅接待大陆客人
         * 3：酒店仅接待大陆和港澳台客人
         */
        private GuestType guestType;

        /**
         * 儿童及加床政策描述信息
         */
        private String children;

        /**
         * 年龄限制
         */
        private AgeLimit ageLimit;

    }

    @Data
    public static class GuestType implements Serializable {
        /**
         * 外宾政策编码
         */
        private Integer code;

        /**
         * 外宾政策名称
         */
        private String name;
    }

    @Data
    public static class AgeLimit implements Serializable {
        /**
         * 是否有入住年龄限制
         * 0：不限制
         * 1：限制
         */
        private Integer isLimited;

        /**
         * 入住最大年龄，包含边界，不限制年龄时为空
         * 数字18~99，0表示“不限”
         */
        private Integer maxAge;

        /**
         * 入住最小年龄，包含边界，不限制年龄时为空
         * 数字18~99，0表示“不限”
         */
        private Integer minAge;

    }

    @Data
    public static class BreakfastPolicy implements Serializable {
        /**
         * 是否提供早餐：
         * 0:不提供;
         * 1:提供；
         */
        private Integer hasBreakfast;

        /**
         * 早餐类型列表
         * 枚举值如下：
         * 0-西式
         * 1-中式
         * 2-日式
         * 3-美式
         * 4-亚洲风味
         * 5-欧陆式
         * 6-全套英式/爱尔兰式
         * 7-无麸质
         * 8-清真
         * 9-意式
         * 10-犹太洁食
         * 11-全素食
         * 12-素食
         */
        private List<BreakfastType> types;

        /**
         * 早餐形式列表
         * 枚举值如下：
         * 0：单点
         * 1：自助餐
         * 2：固定套餐
         */
        private List<BreakfastStyle> styles;

        /**
         * 早餐价格
         */
        private BreakfastAmount amount;

        /**
         * 早餐种类列表
         * 枚举值如下：
         * 1.面包
         * 2.点心
         * 3.薄煎饼
         * 4.果酱
         * 5.黄油
         * 6.奶酪
         * 7.谷物
         * 8.冷盘肉
         * 9.鸡蛋
         * 10.酸奶
         * 11.水果
         * 12.咖啡
         * 13.茶
         * 14.热巧克力
         * 15.果汁
         * 16.香槟
         * 17.单点菜单
         * 18.当地特色
         * 19.熟菜/热菜
         */
        private List<BreakfastCategory> categories;

        /**
         * 早餐营业时间段列表
         */
        private List<BreakfastTime> businessHours;
    }

    @Data
    public static class BreakfastType implements Serializable {
        /**
         * 早餐类型code
         */
        private Integer code;

        /**
         * 早餐类型code对应的描述
         */
        private String name;
    }

    @Data
    public static class BreakfastStyle implements Serializable {
        /**
         * 早餐形式code
         */
        private Integer code;

        /**
         * 早餐形式code对应的描述
         */
        private String name;
    }

    @Data
    public static class BreakfastAmount implements Serializable {
        /**
         * 金额，单位元
         */
        private String price;

        /**
         * 币种, 目前只有人民币
         */
        private String currency;
    }

    @Data
    public static class BreakfastCategory implements Serializable {
        /**
         * 早餐种类code
         */
        private Integer code;

        /**
         * 早餐种类名称
         */
        private String name;
    }

    @Data
    public static class BreakfastTime implements Serializable {
        /**
         * 早餐日期对应的code，允许为空，空表示不限制日期。枚举值如下：
         * 0-星期一;
         * 1-星期二;
         * 2-星期三;
         * 3-星期四;
         * 4-星期五;
         * 5-星期六;
         * 6-星期日;
         */
        private Integer weekDay;

        /**
         * 早餐时间段列表
         * 存储格式：hh:mm-hh:mm；以00:00-23:59为最大长度。
         */
        private List<String> times;
    }

    @Data
    public static class PetPolicy implements Serializable {
        /**
         * 是否允许带宠物：
         * 0-禁止；
         * 1-允许，不确认收费情况；
         * 2-允许，收费；
         * 3-允许，免费；
         */
        private Integer allowed;
    }

    @Data
    public static class ParkingPolicy implements Serializable {
        /**
         * 停车场政策项包括：
         * HAS_PARKING：是否有停车场；
         * PARKING_LOCATION：停车场位置；
         * PARKING_TYPE：停车场类型；
         * PARKING_BOOK_TYPE：停车场预订；
         * PARKING_FEE_TYPE：停车场费用类型；
         * PARKING_FEE_UNIT：停车场收费单位；
         * PARKING_AMOUNT：停车场收费金额；
         * PARKING_COUNT：车位数量；
         * PARKING_DISTANCE：停车后步行距离；
         */
        private List<HotelPolicyItem> policyItems;
    }

    @Data
    public static class ChargePointPolicy implements Serializable {
        /**
         * 充电车位政策项包括：
         * HAS_CHARGING_POINT：是否有充电车位；
         * CHARGING_POINT_LOCATION：充电车位位置；
         * CHARGING_POINT_TYPE：充电车位类型；
         * CHARGING_POINT_COUNT：充电车位数量；
         * CHARGING_POINT_DISTANCE：停车后步行距离；
         */
        private List<HotelPolicyItem> policyItems;
    }

    @Data
    public static class HotelPolicyItem implements Serializable {
        /**
         * 政策类型
         */
        private String type;

        /**
         * 政策类型名称
         */
        private String name;

        /**
         * 政策值
         */
        private String value;

        /**
         * 政策描述信息
         */
        private String description;
    }

    @Data
    public static class Facility implements Serializable {
        /**
         * 酒店设施类别：
         * HOTEL_SERVICE：酒店服务;
         * HOTEL_FACILITY:酒店设施;
         */
        private String category;

        /**
         * 设施服务项信息
         */
        private List<FacilityItem> facilityItems;
    }

    @Data
    public static class FacilityItem implements Serializable {
        /**
         * 设施服务编号ID
         */
        private Integer id;

        /**
         * 设施服务名称，属性中文名
         */
        private String name;

        /**
         * 设施属性值
         */
        private String value;
    }

    @Data
    public static class Image implements Serializable {
        /**
         * 图片的类别，参见《图片类别字典表》
         */
        private Integer category;

        /**
         * 图片标题
         */
        private String title;

        /**
         * 包含所有可用图片尺寸的链接列表
         */
        private List<Link> links;
    }

    @Data
    public static class Link implements Serializable {
        /**
         * 图片大小
         */
        private String size;

        /**
         * 图片URL
         */
        private String url;

        /**
         * 图片描述
         */
        private String description;
    }

    @Data
    public static class RoomBaseInfo implements Serializable {
        /**
         * 物理房型ID
         * 注意：物理房型ID（realRoomId）可能为空，可自行过滤
         */
        private Integer realRoomId;

        /**
         * 酒店ID
         */
        private Long hotelId;

        /**
         * 房型名称
         */
        private String name;

        /**
         * 房型英文名称
         */
        private String nameEn;

        /**
         * 房间描述信息
         */
        private Description descriptions;

        /**
         * 房间可用面积
         */
        private String useAbleArea;

        /**
         * 房间容纳人数
         */
        private Occupancy occupancy;

        /**
         * 房间所在楼层
         */
        private String floor;

        /**
         * 房型状态
         * 0：无效；1：有效；
         */
        private Integer status;

        /**
         * 加床情况
         * false：不可加床；true：可以加床；
         */
        private Boolean allowExtraBed;

        /**
         * 上网方式
         * 0：无法上网；1：无线WIFI；2：有线宽带；3：无线WIFI和有线宽带；4：免费无线WIFI；5：房间内高速上网；
         */
        private Integer internetAccess;

        /**
         * 窗户信息
         */
        private Window window;

        /**
         * 床型基本信息
         */
        private List<List<BedGroup>> bedGroups;
    }

    @Data
    public static class Description implements Serializable {
        /**
         * 客房概述
         */
        private String overview;
    }

    @Data
    public static class Occupancy implements Serializable {
        /**
         * 房间最大容纳人数
         */
        private Integer total;
    }

    @Data
    public static class Window implements Serializable {
        /**
         * 房间窗户情况：
         * 0：有窗；
         * 1：部分有窗；
         * 2：无窗；
         */
        private Integer hasWindow;

        /**
         * 窗景描述
         */
        private String description;

        /**
         * 窗户不利因素，可能有多个，多个不利因素以逗号分隔：
         * 0 朝向走廊；
         * 1 装饰性假窗；
         * 2 天窗；
         * 3 窗户较小；
         * 4 窗外是墙体；
         * 5 有窗但不能打开通风；
         * 6 飘窗；
         * 7 窗户位于走廊或过道；
         * 8 窗户可打开通风，且窗外是开放的户外环境；
         */
        private String disadvantage;
    }

    @Data
    public static class BedGroup implements Serializable {
        /**
         * 床型类型，参见《床型类型字典》
         */
        private String type;

        /**
         * 床型描述，参见《床型类型字典》
         */
        private String description;

        /**
         * 床数
         */
        private Integer count;
    }
}
